import { IImAudio, IImFile, IImGeo, IImImage, IImVideo, IMessageType, IScene } from "../base";
import { IMessageAttach } from './Team';

export interface IMessageBase {
  _id?: string;
  /**
   * scene+(from+to 排序)组成用于加速聊天记录检索
   */
  uniId?: string;
  sessionId?: string;
  scene?: IScene;
  from?: string;
  fromNick?: string;
  /** 发送方的设备类型 */
  fromClientType?: string;
  /** 发送方设备ID */
  fromDeviceId?: string;
  /** 消息接收方，账号或群id */
  to?: string;
  /** 时间戳 */
  time?: number;
  /** 发送方信息更新时间 */
  userUpdateTime?: number;
  /** 消息类型 */
  type?: IMessageType;
  /**
   * 文本消息的文本内容
   */
  text?: string;
  /** 提醒消息的内容 */
  tip?: string;
  /** 自定义消息的消息内容JSON */
  content?: object;
  /** 群通知消息的附加消息 */
  attach?: IMessageAttach;

  /** 服务端的消息ID（同_id） */
  idServer?: string;
  /**
   * 该消息在接收方是否应该被静音
   * 可用于判断是否推送
   */
  isMuted?: boolean;
  /** 是否是重发的消息 */
  resend?: boolean;
  /**
   * 扩展字段JSON
   */
  custom?: string;
  /**
   * 自定义推送文案
   */
  pushContent?: string;
  /**
   * 自定义的推送属性JSON
   */
  pushPayload?: string;
  /**
   * 特殊推送选项, 只在群会话中使用
   */
  apns?: IMessageApns;
  /** 是否需要推送 */
  isPushable?: boolean;
  /** 是否需要推送昵称 */
  needPushNick?: boolean;

  /** 是否存储云端历史 */
  isHistoryable?: boolean;
  /** 是否支持漫游 */
  isRoamingable?: boolean;
  /** 是否支持发送者多端同步 */
  isSyncable?: boolean;
  /** 是否支持抄送 */
  cc?: boolean;
  /** 是否要存离线 */
  isOfflinable?: boolean;
  /** 是否计入消息未读数 */
  isUnreadable?: boolean;
  /** 是否为应答消息（用于机器人等类似场景等应答消息内容） */
  isReplyMsg?: boolean;
  /** 群已读消息快照大小（即消息发送时的群人数-1） */
  tempTeamMemberCount?: number;

  /**
   * 被回复消息的发送者账号
   */
  replyMsgFromAccount?: string;
  /**
   * 被回复消息的接受者账号
   */
  replyMsgToAccount?: string;
  /**
   * 被回复消息的时间
   */
  replyMsgTime?: string;
  /**
   * 被回复消息的idServer
   */
  replyMsgIdServer?: string;
  /**
   * 被回复消息的idClient
   */
  replyMsgIdClient?: string;
  /**
   * thread消息的发送者账号
   */
  threadMsgToAccount?: string;
  /**
   * thread消息的时间
   */
  threadMsgTime?: string;
  /**
   * thread消息的idServer
   */
  threadMsgIdServer?: string;
  /**
   * thread消息的idClient
   */
  threadMsgIdClient?: string;
  /**
   * thread消息的发送者账号
   */
  threadMsgFromAccount?: string;
  /**
   * 表示改消息是否已被撤回或单向删除,获取thread消息列表时会用到
   */
  delete?: boolean;
  /**
   * 开发者自定义的消息子类型，格式为大于0的整数
   */
  subType?: number;
  /**
   * 环境变量，用于指向不同的抄送、第三方回调等配置
   */
  env?: number;
  /* 谁隐藏（删除）了消息 */
  hides?: string[];

  /* 客户端 */
  key?: string;
  /**
   * SDK生成的消息id, 在发送消息之后会返回给开发者, 开发者可以在发送消息的结果回调里面根据这个ID来判断相应消息的发送状态, 到底是发送成功了还是发送失败了, 然后根据此状态来更新页面的UI。如果发送失败, 那么可以重新发送此消息
   */
  idClient?: string;
  /**
   * @todo 不确定具体作用先保留
   */
  idClientFake?: string;
  /**
   * @todo 不确定
   */
  deletedIdClient?: string;
  /**
   * 聊天对象（与to重复）
   * 应该是前端使用不存储后端
   * 账号或者群id
   */
  target?: string;
  /** 
   * 消息的流向
   * in 收到的消息 out 发出的消息
   */
  flow?: 'in' | 'out';
  /** 消息发送状态 */
  status?: 'sending' | 'success' | 'fail';
  /**
   * 本地自定义扩展字段
   * 在支持数据库时可以调用更新本地消息来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上
   */
  localCustom?: string;
  /** 是否是本地消息 */
  isLocal?: boolean;
}

interface IMessageText extends Omit<IMessageBase, 'type'> {
  type: 'text';
  text: string;
}

interface IMessageImage extends Omit<IMessageBase, 'type'> {
  type: 'image';
  file: IImImage;
}

interface IMessageAudio extends Omit<IMessageBase, 'type'> {
  type: 'audio';
  file: IImAudio;
}

interface IMessageVideo extends Omit<IMessageBase, 'type'> {
  type: 'video';
  file: IImVideo;
}

interface IMessageFile extends Omit<IMessageBase, 'type'> {
  type: 'file';
  file: IImFile;
}

interface IMessageGeo extends Omit<IMessageBase, 'type'> {
  type: 'geo';
  geo?: IImGeo;
}

interface IMessageTag extends Omit<IMessageBase, 'type'> {
  type: 'timeTag';
  text: string;
  key: string;
}

interface IMessageNormal extends Omit<IMessageBase, 'type'> {
  type: 'custom' | 'tip' | 'robot' | 'notification';
}

export type IMessage = IMessageNormal | IMessageText | IMessageImage | IMessageAudio | IMessageVideo | IMessageFile | IMessageGeo | IMessageTag;
export interface IMessageApns {
  /**
   * 需要特殊推送的账号列表, 此字段不存在的话表示推送给当前会话内的所有用户
   */
  accounts?: string[];
  /** 需要特殊推送的文案 */
  content?: string;
  /**
   * 是否强制推送, true 表示即使推送列表中的用户屏蔽了当前会话（如静音）, 仍能够推送当前这条内容给相应用户
   */
  forcePush?: boolean;
}

/**
 * User Mongoose Model
 */
export const SchemaMessage = {
  uniId: String,
  sessionId: String,
  scene: String,
  from: String,
  fromNick: String,
  /** 发送方的设备类型 */
  fromClientType: String,
  /** 发送方设备ID */
  fromDeviceId: String,
  /** 消息接收方，账号或群id */
  to: String,
  /** 时间戳 */
  time: Number,
  /** 发送方信息更新时间 */
  userUpdateTime: Number,
  /** 消息类型 */
  type: String,
  /**
   * 文本消息的文本内容
   */
  text: String,
  file: Object,
  geo: Object,
  /** 提醒消息的内容 */
  tip: String,
  
  /** 自定义消息的消息内容JSON */
  content: Object,
  /** 群通知消息的附加消息 */
  attach: Object,

  /** 服务端的消息ID（同_id） */
  idServer: String,
  idClient: String,
  /**
   * 该消息在接收方是否应该被静音
   * 可用于判断是否推送
   */
  isMuted: Boolean,
  /** 是否是重发的消息 */
  resend: Boolean,
  /**
   * 扩展字段JSON
   */
  custom: String,
  /**
   * 自定义推送文案
   */
  pushContent: String,
  /**
   * 自定义的推送属性JSON
   */
  pushPayload: String,
  /**
   * 特殊推送选项, 只在群会话中使用
   */
  apns: Object,
  /** 是否需要推送 */
  isPushable: Boolean,
  /** 是否需要推送昵称 */
  needPushNick: Boolean,

  /** 是否存储云端历史 */
  isHistoryable: Boolean,
  /** 是否支持漫游 */
  isRoamingable: Boolean,
  /** 是否支持发送者多端同步 */
  isSyncable: Boolean,
  /** 是否支持抄送 */
  cc: Boolean,
  /** 是否要存离线 */
  isOfflinable: Boolean,
  /** 是否计入消息未读数 */
  isUnreadable: Boolean,
  /** 是否为应答消息（用于机器人等类似场景等应答消息内容） */
  isReplyMsg: Boolean,
  /** 群已读消息快照大小（即消息发送时的群人数-1） */
  tempTeamMemberCount: Number,

  /**
   * 被回复消息的发送者账号
   */
  replyMsgFromAccount: String,
  /**
   * 被回复消息的接受者账号
   */
  replyMsgToAccount: String,
  /**
   * 被回复消息的时间
   */
  replyMsgTime: String,
  /**
   * 被回复消息的idServer
   */
  replyMsgIdServer: String,
  /**
   * 被回复消息的idClient
   */
  replyMsgIdClient: String,
  /**
   * thread消息的发送者账号
   */
  threadMsgToAccount: String,
  /**
   * thread消息的时间
   */
  threadMsgTime: String,
  /**
   * thread消息的idServer
   */
  threadMsgIdServer: String,
  /**
   * thread消息的idClient
   */
  threadMsgIdClient: String,
  /**
   * thread消息的发送者账号
   */
  threadMsgFromAccount: String,
  /**
   * 表示改消息是否已被撤回或单向删除,获取thread消息列表时会用到
   */
  delete: Boolean,
  /**
   * 开发者自定义的消息子类型，格式为大于0的整数
   */
  subType: Number,
  /**
   * 环境变量，用于指向不同的抄送、第三方回调等配置
   */
  env: Number,
  hides: Array,
};
